package br.com.gbvbahia.mybooks.fragment;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
import br.com.gbvbahia.commons.Transacao.Transacao;
import br.com.gbvbahia.commons.utils.AndroidUtils;
import br.com.gbvbahia.mybooks.ListarEditoras;
import br.com.gbvbahia.mybooks.ListarPrateleiras;
import br.com.gbvbahia.mybooks.R;
import br.com.gbvbahia.mybooks.constantes.StatusLivro;
import br.com.gbvbahia.mybooks.constantes.TipoLivro;
import br.com.gbvbahia.mybooks.dao.EditoraDAO;
import br.com.gbvbahia.mybooks.modelos.EditoraVO;
import br.com.gbvbahia.mybooks.modelos.LivroVO;
import br.com.gbvbahia.mybooks.modelos.PrateleiraVO;
import br.com.gbvbahia.mybooks.service.AppService;

public class LivroCadastrarFragment extends FragmentMae {
	private static final int REQ_EDITORAS = 1;
	private static final int REQ_PRATELEIRAS = 2;
	public ImageButton btnSearch;
	private EditText inputSearch;
	private Button btnCadastro;
	private Button btnCancel;
	private Button btnNew;
	private Button btnListarEditoras;
	private Button btnListarPrateleiras;
	private EditText inputNome;
	private EditText inputAutor;
	private EditText inputEdicao;
	private EditText inputEditora;
	private EditText inputPrateleira;
	private EditText inputAno;
	private EditText inputISBN;
	private EditText inputDescricao;
	private Spinner spinnerStatus;
	private Spinner spinnerTipo;
	private LivroVO livroCad;
	private EditoraDAO editoraDAO;
	private AppService service;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		editoraDAO = new EditoraDAO(getActivity());
		service = new AppService(getActivity());
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		final View view = inflater.inflate(R.layout.frag_cadastrar, null);
		btnSearch = (ImageButton) view.findViewById(R.id.btnSearch);
		inputSearch = (EditText) view.findViewById(R.id.searchTextHeader);
		inputSearch.setHint(getString(R.string.isbn));
		inputSearch.setInputType(InputType.TYPE_CLASS_NUMBER);

		btnCadastro = (Button) view.findViewById(R.id.btnHeaderOk);
		btnCancel = (Button) view.findViewById(R.id.btnHeaderCancelar);
		btnNew = (Button) view.findViewById(R.id.btnHeaderNovo);
		btnListarEditoras = (Button) view
				.findViewById(R.id.btnCadastroEditorasList);
		btnListarPrateleiras = (Button) view
				.findViewById(R.id.btnCadastroPrateleiraList);
		inputNome = (EditText) view.findViewById(R.id.inputCadastroNome);
		inputAutor = (EditText) view.findViewById(R.id.inputCadastroAutor);
		inputEdicao = (EditText) view.findViewById(R.id.editCadastroEdicao);
		inputEditora = (EditText) view.findViewById(R.id.inputCadastroEditora);
		inputPrateleira = (EditText) view
				.findViewById(R.id.inputCadastroPrateleira);
		inputAno = (EditText) view.findViewById(R.id.inputCadastroAno);
		inputISBN = (EditText) view.findViewById(R.id.inputCadastroIsbn);
		inputDescricao = (EditText) view
				.findViewById(R.id.inputCadastroDescricao);
		// Spinner Status
		createSpinnerStatus(view);
		// Spinner Tipo
		createSpinnerTipo(view);

		btnCadastro.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				LivroVO livro = getLivroVO(view);
				String editora = inputEditora.getText().toString();
				String prateleira = inputPrateleira.getText().toString();
				if(!livro.seValidar().isEmpty()){
					for(Integer aviso : livro.seValidar()){
						Toast.makeText(getActivity(),
								getString(aviso),
								Toast.LENGTH_SHORT).show();
					}
					return;
				}
				startTransacao(new SalvarLivroTransacao(livro, editora,
						prateleira));
				inputNome.requestFocus();
				AndroidUtils.closeVirtualKeyboard(getActivity(), inputNome);
			}
		});

		btnCancel.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				getActivity().finish();
			}
		});

		btnNew.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				setLivro(null);
			}
		});

		// Carrega lista com editoras
		btnListarEditoras.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				startActivityForResult(new Intent(getActivity(),
						ListarEditoras.class), REQ_EDITORAS);
			}
		});
		// Carrega lista com prateleiras
		btnListarPrateleiras.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				startActivityForResult(new Intent(getActivity(),
						ListarPrateleiras.class), REQ_PRATELEIRAS);
			}
		});

		btnSearch.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				String textSearch = inputSearch.getText().toString();
				if (TextUtils.isEmpty(textSearch)) {
					Toast.makeText(LivroCadastrarFragment.this.getActivity(),
							getString(R.string.aviso_19), Toast.LENGTH_SHORT)
							.show();
					return;
				}
				startTransacaoComRede(new BuscarLivroWebService());
			}
		});
		inputNome.requestFocus();
		InputMethodManager imm = (InputMethodManager) getActivity()
				.getSystemService(Context.INPUT_METHOD_SERVICE);
		imm.hideSoftInputFromWindow(inputNome.getWindowToken(), 0);
		return view;
	}

	/**
	 * @param view
	 */
	private void createSpinnerTipo(final View view) {
		spinnerTipo = (Spinner) view.findViewById(R.id.spinnerTipo);
		List<String> spinnerTipos = new ArrayList<String>();
		// ATENCAO: dependete da ordem das enums
		spinnerTipos.add(getString(R.string.selecione));
		spinnerTipos.add(getString(TipoLivro.PAPEL.getHexaRString()));
		spinnerTipos.add(getString(TipoLivro.EBOOK.getHexaRString()));
		spinnerTipos.add(getString(TipoLivro.PDF.getHexaRString()));
		spinnerTipos.add(getString(TipoLivro.OUTRO.getHexaRString()));
		ArrayAdapter<String> spinneAddapter = new ArrayAdapter<String>(
				getActivity(), android.R.layout.simple_spinner_item,
				spinnerTipos);
		spinneAddapter
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinnerTipo.setAdapter(spinneAddapter);
	}
	
	/**
	 * @param view
	 */
	private void createSpinnerStatus(final View view) {
		spinnerStatus = (Spinner) view.findViewById(R.id.spinnerStatus);
		List<String> spinnerStatuss = new ArrayList<String>();
		// ATENCAO: dependete da ordem das enums
		spinnerStatuss.add(getString(R.string.selecione));
		spinnerStatuss.add(getString(StatusLivro.LENDO.getHexaRString()));
		spinnerStatuss.add(getString(StatusLivro.A_LER.getHexaRString()));
		spinnerStatuss.add(getString(StatusLivro.LIDO.getHexaRString()));
		spinnerStatuss.add(getString(StatusLivro.TENTEI.getHexaRString()));
		spinnerStatuss.add(getString(StatusLivro.COMPRAREI.getHexaRString()));
		ArrayAdapter<String> spinneAddapter = new ArrayAdapter<String>(
				getActivity(), android.R.layout.simple_spinner_item,
				spinnerStatuss);
		spinneAddapter
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinnerStatus.setAdapter(spinneAddapter);
	}

	/**
	 * Insere informações do livro nas views. Se livro nulo limpa as views
	 * para receber um novo livro.
	 * 
	 * @param livro
	 */
	public void setLivro(LivroVO livro) {
		if (livro != null) {
			livroCad = livro;
			inputNome.setText(livro.getNomeLivro());
			inputAutor.setText(livro.getAutorLivro());
			if (livro.getCdEditora() != null) {
				EditoraVO editora = editoraDAO.getByID(livro.getCdEditora());
				inputEditora.setText(editora == null ? "" : editora.getNome());
			} else {
				inputEditora.setText("");
			}
			inputEdicao.setText(livro.getEdicaoLivro() == 0 ? "" : Integer
					.toString(livro.getEdicaoLivro()));
			inputAno.setText(livro.getAno() == 0 ? "" : Integer.toString(livro
					.getAno()));
			inputISBN.setText(livro.getIsbnLivro());
			inputDescricao.setText(livro.getDescricao());

			/* PRATELEIRA */
			List<PrateleiraVO> prateleiras = service
					.buscarPrateleirasPorLivro(livro);
			String prats = "";
			for (PrateleiraVO prat : prateleiras) {
				prats += prat.getNome();
			}
			inputPrateleira.setText(prats);

			/* RADIOS */
			if (livro.getStatus() != null) {
				//+1 Mais selecione
				spinnerStatus.setSelection(livro.getStatus().ordinal() + 1);
			}else {
				spinnerStatus.setSelection(0);
			}

			if (livro.getTipo() != null) {
				// ATENCAO: dependete da ordem das enums
				//+1 Mais selecione
				spinnerTipo.setSelection(livro.getTipo().ordinal() + 1);
			} else {
				spinnerTipo.setSelection(0);
			}
		} else {
			livroCad = new LivroVO();
			inputNome.setText("");
			inputAutor.setText("");
			inputEditora.setText("");
			inputEdicao.setText("");
			inputAno.setText("");
			inputISBN.setText("");
			inputDescricao.setText("");
			inputPrateleira.setText("");
			spinnerStatus.setSelection(0);
			spinnerTipo.setSelection(0);
		}
	}

	/**
	 * Com base nos conteudos das views monta um livro
	 * 
	 * @param view
	 * @return
	 */
	private LivroVO getLivroVO(View view) {
		if (livroCad == null) {
			livroCad = new LivroVO();
		}
		livroCad.setNomeLivro(inputNome.getText().toString());
		livroCad.setAutorLivro(inputAutor.getText().toString());
		livroCad.setIsbnLivro(inputISBN.getText().toString());
		livroCad.setDescricao(inputDescricao.getText().toString());

		String edicao = inputEdicao.getText().toString();
		if (!TextUtils.isEmpty(edicao)) {
			livroCad.setEdicaoLivro(Integer.valueOf(edicao));
		}
		String ano = inputAno.getText().toString();
		if (!TextUtils.isEmpty(ano)) {
			livroCad.setAno(Integer.valueOf(ano));
		}

		Spinner spStatus = (Spinner) view.findViewById(R.id.spinnerStatus);
		int positionStatus = spStatus.getSelectedItemPosition();
		if(positionStatus == Spinner.INVALID_POSITION){
			livroCad.setStatus(null);
		}else {
			//-1 = Menos selecione
			StatusLivro status = StatusLivro.getStatus(positionStatus - 1);
			livroCad.setStatus(status);
		}
		
		Spinner spTipo = (Spinner) view.findViewById(R.id.spinnerTipo);
		int positionTipo = spTipo.getSelectedItemPosition();
		if (positionTipo == Spinner.INVALID_POSITION) {
			livroCad.setTipo(null);
		} else {
			TipoLivro tipo = TipoLivro.getTipo(positionTipo - 1);
			livroCad.setTipo(tipo);
		}
		return livroCad;
	}

	// Recolhe a editora/prateleira selecionada
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (REQ_EDITORAS == requestCode) {
			if (resultCode == Activity.RESULT_OK) {
				inputEditora.setText(data
						.getStringExtra(ListarEditoras.RESULT_EDITORA));
			}
		}
		if (REQ_PRATELEIRAS == requestCode) {
			if (resultCode == Activity.RESULT_OK) {
				String pratSelected = data
						.getStringExtra(ListarPrateleiras.RESULT_PRATELEIRA);
				inputPrateleira.setText(pratSelected);
			}
		}
	}

	/**
	 * Transacao para salvar livro de modo assincrono.
	 * 
	 * @author Guilherme
	 * 
	 */
	public class SalvarLivroTransacao implements Transacao {
		private LivroVO toSave;
		private String editoraNome;
		private String prateleiraNome;
		private String idLivro = null;
		private AppService livroService;

		public SalvarLivroTransacao(LivroVO livro, String editora,
				String prateleira) {
			super();
			toSave = livro;
			editoraNome = editora;
			prateleiraNome = prateleira;
			livroService = new AppService(
					LivroCadastrarFragment.this.getActivity());
		}

		@Override
		public void executar() throws Exception {
			idLivro = livroService.salvarLivro(toSave, editoraNome,
					prateleiraNome);
		}

		@Override
		public void atualizarView() {
			if (getActivity() != null && !getActivity().isFinishing())
				if (idLivro != null
						&& !idLivro.equals(AppService.VALIDACAO_ERROR)) {
					Toast.makeText(
							LivroCadastrarFragment.this.getActivity(),
							toSave.getNomeLivro() + " "
									+ getString(R.string.aviso_1),
							Toast.LENGTH_SHORT).show();
					setLivro(null);
					FragmentTransfer tf = (FragmentTransfer) LivroCadastrarFragment.this
							.getActivity();
					tf.updateFragment(R.layout.frag_cadastrar, idLivro);

				} else if (idLivro != null
						&& idLivro.equals(AppService.VALIDACAO_ERROR)) {
					AndroidUtils.alertDialog(
							LivroCadastrarFragment.this.getActivity(),
							R.string.aviso_3, R.string.app_name);
				} else {
					AndroidUtils.alertDialog(LivroCadastrarFragment.this
							.getActivity(), LivroCadastrarFragment.this
							.getActivity().getString(R.string.aviso_15),
							R.string.app_name);
				}
		}

	}

	/**
	 * Classe responsavel por buscar informacoes do livro via webservice, Devera
	 * buscar informacoes, quando tiver retorno atualizar o fragment
	 * responsavel.
	 * 
	 * @author Guilherme
	 * 
	 */
	public class BuscarLivroWebService implements Transacao {
		@Override
		public void executar() throws Exception {
			Thread.sleep(3000);
		}

		@Override
		public void atualizarView() {
			// TODO Momentaneo
			if (getActivity() != null && !getActivity().isFinishing()) {
				Toast.makeText(LivroCadastrarFragment.this.getActivity(),
						"A busca nao encontrou resultado", Toast.LENGTH_SHORT)
						.show();
			}
		}

	}
}
